package rmi;

import interfaces.InterfaceRemota;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;
import java.util.List;

import negocio.Administracion;
import negocio.Cliente;
import dao.AdministracionDAO;
import dao.CargaDAO;
import dao.ClienteDAO;
import dao.EmpleadoDAO;
import dao.ProductoDAO;
import dao.TamanioDAO;
import dao.UbicacionDAO;
import dto.CargaDTO;
import dto.ClienteDTO;
import dto.EmpleadoDTO;
import dto.EmpresaDTO;
import dto.EnvioDTO;
import dto.ParticularDTO;
import dto.ProductoDTO;
import dto.RemitoDTO;
import dto.SucursalDTO;
import dto.TamanioDTO;
import dto.TipoTransporteDTO;
import dto.UbicacionDTO;
import dto.VehiculoDTO;

public class NegocioRemoto extends UnicastRemoteObject implements InterfaceRemota
{
	private static final long serialVersionUID = -7128439725795095116L;

	public NegocioRemoto() throws RemoteException {
		super();
	}

	public void grabarEmpleado(EmpleadoDTO emp)
	{
		EmpleadoDAO.getInstancia().grabarEmpleado(emp);
		return;
	}

	@Override
	public boolean saveCliente(ClienteDTO cliente) throws RemoteException {
		Cliente cli = new Cliente();
		cli.setId(cliente.getId());
		return Administracion.getInstancia().agregarCliente(cli);
	}

	// ESTE METODO NO FUNCIONA. ARROJA Que NO CONOCE LA PARTICULARENTITY
	@Override
	public ParticularDTO LoadParticular(ParticularDTO cliente) // Hay que armarlo
			throws RemoteException {
		return Administracion.getInstancia().getParticular(cliente);
		// TODO Auto-generated method stub
		//hay que implementar la busqueda del cliente, por el dni que viene contenido en el cliente pasado como argumento
		//Si no existe, graba el apellido en null en el dto y lo devuelve
		//cliente.setApellido(null); // ahora hago esto para controlarlo desde la servlet
		//return cliente;
	}

	@Override 
	public List<VehiculoDTO> vehiculosSinMantenimiento() throws RemoteException 
	{
		return Administracion.getInstancia().vehiculosSinMantenimiento();
	}
	
	@Override 
	public List<VehiculoDTO> vehiculosConMantenimiento() throws RemoteException 
	{
		return Administracion.getInstancia().vehiculosMantenimiento();
	}
	
	@Override // Hay que armarlo. Es identico al anterior solo que para una empresa
	// ESTE METODO NO FUNCIONA. ARROJA Que NO CONOCE LA EMPRESAENTITY
	public EmpresaDTO loadEmpresa(EmpresaDTO empresa) throws RemoteException 
	{
		return Administracion.getInstancia().getEmpresa(empresa);
		//empresa.setRazonSocial(null);
		//return empresa;
	}

	@Override
	public void testUbicacion(UbicacionDTO ubicacion) throws RemoteException 
	{
		UbicacionDAO.getInstancia().grabarUbicacion(ubicacion);
	}

	@Override
	public boolean updateMantenimientoVehiculos(List<String> idVehiculos)
			throws RemoteException 
			{
		String [] ids = null;
		for (String idVe : idVehiculos) 
		{
			int i=0;
			ids[i] =idVe;
			i++;
		}
		return Administracion.getInstancia().agregarOperacionMantenimiento(ids);
	}
	
	@Override
	public void saveCarga(CargaDTO carga) throws RemoteException {
		Administracion.getInstancia().agregarCarga(carga);
	}

	@Override
	public List<TamanioDTO> loadTamanios() throws RemoteException {
		List<TamanioDTO> resultado = Administracion.getInstancia().getTamanios();
		return resultado;
	}

	@Override
	public List<SucursalDTO> loadSucursales() throws RemoteException {
		// TODO Auto-generated method stub
		List<SucursalDTO> resultado = Administracion.getInstancia().getSucursales();
		return resultado;		
	}

	@Override
	public List<TipoTransporteDTO> loadTipos() throws RemoteException {
		return Administracion.getInstancia().getTipos();
	}

	@Override
	public ParticularDTO getParticular(ParticularDTO part)
			throws RemoteException {
		return Administracion.getInstancia().getParticular(part);
	}

	@Override
	public EmpresaDTO getEmpresa(EmpresaDTO empresa) throws RemoteException 
	{
		return Administracion.getInstancia().getEmpresa(empresa); 
	}

	@Override
	public boolean agregarEmpresa(EmpresaDTO emp) throws RemoteException 
	{
		return Administracion.getInstancia().agregarEmpresa(emp);
	}
	
	@Override
	public boolean agregarParticular(ParticularDTO par) throws RemoteException 
	{
		return Administracion.getInstancia().agregarParticular(par);
	}
	
	@Override
	public List<ParticularDTO> getParticularList() throws RemoteException 
	{
		return Administracion.getInstancia().getParticularList();
	}

	@Override
	public List<EmpresaDTO> getEmpresaList() throws RemoteException 
	{
		return Administracion.getInstancia().getEmpresaList();
	}

	@Override
	public List<CargaDTO> loadCargas(int id) throws RemoteException {
		return Administracion.getInstancia().getCargasPorCliente(id);
	}

	@Override
	public List<SucursalDTO> getSucursales() throws RemoteException 
	{
		return Administracion.getInstancia().getSucursales();
	}
	
	@Override
	public List<EnvioDTO> enviosPendienteDePago (EmpresaDTO empresa) throws RemoteException
	{
		return Administracion.getInstancia().enviosPendienteDePago(empresa);
	}

	@Override
	public TamanioDTO loadTamanio(int id) throws RemoteException {
		return TamanioDAO.getInstancia().obtenerTamanio(id);
	}

	@Override
	public ClienteDTO LoadCliente(int id) throws RemoteException {
		return (new Cliente(ClienteDAO.getInstancia().LoadCliente(id)).toDTO());
	}
	
	@Override
	public List<CargaDTO> cargasPendientesFacturar() throws RemoteException {
		return Administracion.getInstancia().cargasPendientesFacturar();
	}

	@Override
	public boolean agregarProductoEmpresa(ProductoDTO prod)
			throws RemoteException {
		// TODO Auto-generated method stub
		return ProductoDAO.getInstancia().grabarProducto(prod);
	}
	
	@Override
	public boolean pagarFactura(RemitoDTO remito)
			throws RemoteException {
		return Administracion.getInstancia().pagarFactura(remito);
	}

	@Override
	public RemitoDTO obtenerRemito(int id) throws RemoteException {
		return Administracion.getInstancia().obtenerRemito(id);
	}
	
	
	/*
	@OverrideS
	public void saveCliente(ParticularDTO cliente) throws RemoteException {
		// TODO Auto-generated method stub
		//Metodo que recibe un particularDTO y lo graba
		
	}*/

}

